As an application platform, the modern web browser brings together a remarkable combination of resources, including seamless access to Internet resources, high productivity programming languages such as JavaScript, and the richness of the Document Object Model (DOM) for graphics presentation and user interaction. While these strengths put the browser in the forefront as a target for new application development, browser based applications often remain handicapped in the critical dimension of computational performance when compared to native client applications.
Modern web browsers provide various extension mechanisms such as ActiveX and NPAPI plug-ins to allow native code to be loaded and run in a browser as part of a web application. While such architectures allow browser based applications to achieve the performance characteristics of native applications, they do so at expense of allowing the browser based applications to circumvent the security mechanisms otherwise applied to web content. Recent measures such as validating and isolating or “sandboxing” native client code have allowed native code to be run within a browser in a secure and safe fashion. Such methods have been described, for example, in the following applications, all of which are hereby incorporated by reference in their entirety: “Method for Validating an Untrusted Native Code Module,” application Ser. No. 12/117,634, filed May 8, 2008; “Method for Safely Executing an Untrusted Native Code Module on a Computing Device,” application Ser. No. 12/117,650, filed May 8, 2008; “Native Code Module Security for ARM Instruction Set Architectures,” application Ser. No. 12/621,286 filed Nov. 18, 2009, and “Native Code Module Security for 64-bit Instruction Set Architectures, application Ser. No. 12/621,266 filed on Jul. 31, 2009.
The methods and apparatus disclosed in the aforementioned applications, including the disclosed code layout rules and static code analysis, allow arbitrary and untrusted code to be safely run as a browser application by reliably disassembling the code and generating a control flow supergraph. However, once the untrusted code is disassembled and a control flow supergraph is generated, no new code may be added. This prohibits many types of code from being safely sandboxed and run as a browser application. In particular, many current native applications rely on the use of dynamically linked libraries (“DLLs”) or just-in-time (“JIT”) code generation to provide flexibility and coding efficiency. In addition, many modern programming languages such as Go, Java and JavaScript employ dynamic code generation for the same reasons. Methods that allow the validation and sandboxing of untrusted code that uses DLLs and JIT code generation can further extend the browser's use as a platform to run native applications.